package com.zwh.se.io;

import java.io.*;

/**
 * @author zwh
 * 文件字符流操作demo。字符流拥有比字节流更高的性能。
 *
 * 文本文件：.txt .java .c .cpp  --> 建议使用字符流操作
 * 非文本文件：.jpg .mp3 .mp4 .doc .ppt  -->建议使用字节流操作
 */
public class FileReaderWriterStreamDemo {
    public static void main(String[] args) throws IOException {
        File file = new File("\\\\192.168.3.10\\share\\123.txt");
        System.out.println("文件是否存在:" + file.exists());
        System.out.println("---------------测试使用文件字符输出流---------------");
        //当创建输出流对象后,如果输出流发现目标文件不存在的话,就会自动创建此文件
        //默认这样写的话相当于对原文件进行覆盖操作,等同于new FileWriter(file,false)
        //new FileWriter(file) 等同于 new OutputStreamWriter(new FileOutputStream(file))
        Writer fileWriter = new FileWriter(file);
        System.out.println("文件是否存在:" + file.exists());
        try {
            fileWriter.write((char[]) null);
        } catch (NullPointerException e) {
            System.out.println("\033[31;4m" + e + "\033[0m");
            //append跟write区别仅在于如果传入的值是null的时候会写入一个"null"
            fileWriter.append(null);
        }
        fileWriter.write('a');
        fileWriter.write("sadf");
        fileWriter.write("sadf".toCharArray());
        fileWriter.flush();
        //将对原来的文件进行追加，而不是覆盖。
        fileWriter = new FileWriter(file,true);
        fileWriter.write("测试字符输出流");
        fileWriter.close();


        System.out.println("---------------测试使用文件字符输入流---------------");
        //遍历读取的话通常的写法通常有以下两种方式

        // 方式一
        //new FileReader(file) 等同于 new InputStreamReader(new FileInputStream(file))
//        Reader fileReader = new FileReader(file);
//        //创建一个缓冲数组
//        char[] huancun = new char[2];
//        //将读到的内容缓冲到数组里面去
//        int len = fileReader.read(huancun);
//        while (len != -1) {
//            String str = new String(huancun, 0, len);
//            System.out.println(str);
//            len = fileReader.read(huancun);
//        }
//
//        // 方式二
//        fileReader = new FileReader(file);
//        while ((len = fileReader.read(huancun)) != -1) {
//            System.out.println(new String(huancun, 0, len));
//        }

        //你不想用缓冲区直接使用read()也不是不可以,其本质也是read(new char[1]),不过一般不会只读一个字符的

//        fileReader.close();
    }
}
